package com.transpeed.payservice.pay.alipay;

import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.model.ExtendParams;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.transpeed.payservice.log.Log;

/**
 * TODO
 * 阿里支付预下单
 * 如果你调用的是当面付预下单接口(alipay.trade.precreate)，调用成功后订单实际上是没有生成，因为创建一笔订单要买家、卖   家、金额三要素。
 * 预下单并没有创建订单，所以根据商户订单号操作订单，比如查询或者关闭，会报错订单不存在。
 * 当用户扫码后订单才会创建，用户扫码之前二维码有效期2小时，扫码之后有效期根据timeout_express时间指定。
 * @author lizhi
 * @param   String TotalAmount ,String Subject ,String NotifyUrl
 * @return  url + "&" + outTradeNo
 * @date 2017年4月25日
 * 更新日志
 * 2017年4月10日 lizhi 首次创建
 *
 */
public class GetAlipayQRCode {
	// 测试当面付2.0生成支付二维码
	public static String test_trade_precreate(String TotalAmount ,String Subject ,String NotifyUrl) {
		// 存二维码URL用于产生二维码
		String url = null;
		String outTradeNo = null;
		// (必填) 商户网站订单系统中唯一订单号，64个字符以内，只能包含字母、数字、下划线，
		// 需保证商户系统端不能重复，建议通过数据库sequence生成，

		outTradeNo = "AliPayTranSpeed" + System.currentTimeMillis() + (long) (Math.random() * 10000000L);
		
		// (必填) 订单标题，粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
		double totalamount = Float.parseFloat(TotalAmount) / 100.00;
		String subject = Subject;

		// (必填) 订单总金额，单位为元，不能超过1亿元
		// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
		String totalAmount = String.valueOf(totalamount);

		// (可选) 订单不可打折金额，可以配合商家平台配置折扣活动，如果酒水不参与打折，则将对应金额填写至此字段
		// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】

		String undiscountableAmount = "0";

		// 卖家支付宝账号ID，用于支持一个签约账号下支持打款到不同的收款账号，(打款到sellerId对应的支付宝账号)
		// 如果该字段为空，则默认为与支付宝签约的商户的PID，也就是appid对应的PID
		String sellerId = "";

		// 订单描述，可以对交易或商品进行一个详细地描述，比如填写"购买商品2件共15.00元"
		String body = NotifyUrl;//附加参数 目前存入上位机通知地址，用于支付成功后，对指定上位机地址推送成功消息

		// 商户操作员编号，添加此参数可以为商户操作员做销售统计
		String operatorId = "test_operator_id";

		// (必填) 商户门店编号，通过门店号和商家后台可以配置精准到门店的折扣信息，详询支付宝技术支持
		String storeId = "test_store_id";

		// 业务扩展参数，目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法)，详情请咨询支付宝技术支持
		ExtendParams extendParams = new ExtendParams();
		extendParams.setSysServiceProviderId("2088100200300400500");

		// 支付超时，定义为120分钟
		String timeoutExpress = "120m";

		// 商品明细列表，需填写购买商品详细信息，
		//List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
		// // 创建一个商品信息，参数含义分别为商品id（使用国标）、名称、单价（单位为分）、数量，如果需要添加商品类别，详见GoodsDetail
		// GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "小面包",
		// 1000, 1);
		// // 创建好一个商品后添加至商品明细列表
		// goodsDetailList.add(goods1);
		// // 继续创建并添加第一条商品信息，用户购买的产品为“黑人牙刷”，单价为5.00元，购买了两件
		// GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "牙刷",
		// 500, 2);
		// goodsDetailList.add(goods2);

		// 创建扫码支付请求builder，设置请求参数
		AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
				.setSubject(subject)
				.setTotalAmount(totalAmount)
				.setOutTradeNo(outTradeNo)
				.setUndiscountableAmount(undiscountableAmount)
				.setSellerId(sellerId)
				.setBody(body)
				.setOperatorId(operatorId)
				.setStoreId(storeId)
				.setExtendParams(extendParams)
				.setTimeoutExpress(timeoutExpress)
				.setNotifyUrl("http://122.97.128.110:8080/TranSpeed-PayService/AlipayAPI/ReceiveAliPayTradeInfo");// 支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置
				//.setGoodsDetailList(goodsDetailList);
		AlipayF2FPrecreateResult result = AlipayMain.tradeService.tradePrecreate(builder);
		switch (result.getTradeStatus()) {
		case SUCCESS:
			AlipayMain.log.info("支付宝预下单成功: )");
			Log.Write("支付宝预下单成功!", "AlipayQRCode");
			AlipayTradePrecreateResponse response = result.getResponse();
			AlipayMain.dumpResponse(response);
			// 需要修改为运行机器上的路径
			// String filePath
			// =String.format("/Users/sudo/Desktop/qr-%s.png",response.getOutTradeNo());
			String filePath = String.format("C:/Users/Administrator/Desktop/支付宝二维码/qrcode.png",response.getOutTradeNo());
			// Main.log.info("filePath:" + filePath);
			url = response.getQrCode();
			// ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);
			break;

		case FAILED:
			AlipayMain.log.error("支付宝预下单失败!!!");
			Log.Write("支付宝预下单失败!!!", "AlipayQRCode");
			break;

		case UNKNOWN:
			AlipayMain.log.error("系统异常，预下单状态未知!!!");
			Log.Write("系统异常，预下单状态未知!!!", "AlipayQRCode");
			break;

		default:
			AlipayMain.log.error("不支持的交易状态，交易返回异常!!!");
			Log.Write("不支持的交易状态，交易返回异常!!!", "AlipayQRCode");
			break;
		}

		Log.Write(url + "&" + outTradeNo, "AlipayQRCode");
		return url + "&" + outTradeNo;

	}
}
